home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / platform.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  21KB  |  846 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __copyright__ = '\n    Copyright (c) 1999-2000, Marc-Andre Lemburg; mailto:mal@lemburg.com\n    Copyright (c) 2000-2003, eGenix.com Software GmbH; mailto:info@egenix.com\n\n    Permission to use, copy, modify, and distribute this software and its\n    documentation for any purpose and without fee or royalty is hereby granted,\n    provided that the above copyright notice appear in all copies and that\n    both that copyright notice and this permission notice appear in\n    supporting documentation or portions thereof, including modifications,\n    that you make.\n\n    EGENIX.COM SOFTWARE GMBH DISCLAIMS ALL WARRANTIES WITH REGARD TO\n    THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n    FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,\n    INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING\n    FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n    NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION\n    WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !\n\n'
  5. __version__ = '1.0.4'
  6. import sys
  7. import string
  8. import os
  9. import re
  10. _libc_search = re.compile('(__libc_init)|(GLIBC_([0-9.]+))|(libc(_\\w+)?\\.so(?:\\.(\\d[0-9.]*))?)')
  11.  
  12. def libc_ver(executable = sys.executable, lib = '', version = '', chunksize = 2048):
  13.     f = open(executable, 'rb')
  14.     binary = f.read(chunksize)
  15.     pos = 0
  16.     while None:
  17.         m = _libc_search.search(binary, pos)
  18.         if not m:
  19.             binary = f.read(chunksize)
  20.             if not binary:
  21.                 break
  22.             
  23.             pos = 0
  24.             continue
  25.         
  26.         (libcinit, glibc, glibcversion, so, threads, soversion) = m.groups()
  27.         if libcinit and not lib:
  28.             lib = 'libc'
  29.         elif glibc:
  30.             if lib != 'glibc':
  31.                 lib = 'glibc'
  32.                 version = glibcversion
  33.             elif glibcversion > version:
  34.                 version = glibcversion
  35.             
  36.         elif so:
  37.             if lib != 'glibc':
  38.                 lib = 'libc'
  39.                 if soversion > version:
  40.                     version = soversion
  41.                 
  42.                 if threads and version[-len(threads):] != threads:
  43.                     version = version + threads
  44.                 
  45.             
  46.         
  47.         pos = m.end()
  48.         continue
  49.         return (lib, version)
  50.  
  51.  
  52. def _dist_try_harder(distname, version, id):
  53.     if os.path.exists('/var/adm/inst-log/info'):
  54.         info = open('/var/adm/inst-log/info').readlines()
  55.         distname = 'SuSE'
  56.         for line in info:
  57.             tv = string.split(line)
  58.             if len(tv) == 2:
  59.                 (tag, value) = tv
  60.             
  61.             if tag == 'MIN_DIST_VERSION':
  62.                 version = string.strip(value)
  63.                 continue
  64.             len(tv) == 2
  65.             if tag == 'DIST_IDENT':
  66.                 values = string.split(value, '-')
  67.                 id = values[2]
  68.                 continue
  69.         
  70.         return (distname, version, id)
  71.     
  72.     if os.path.exists('/etc/.installed'):
  73.         info = open('/etc/.installed').readlines()
  74.         for line in info:
  75.             pkg = string.split(line, '-')
  76.             if len(pkg) >= 2 and pkg[0] == 'OpenLinux':
  77.                 return ('OpenLinux', pkg[1], id)
  78.                 continue
  79.         
  80.     
  81.     if os.path.isdir('/usr/lib/setup'):
  82.         verfiles = os.listdir('/usr/lib/setup')
  83.         for n in range(len(verfiles) - 1, -1, -1):
  84.             if verfiles[n][:14] != 'slack-version-':
  85.                 del verfiles[n]
  86.                 continue
  87.         
  88.         if verfiles:
  89.             verfiles.sort()
  90.             distname = 'slackware'
  91.             version = verfiles[-1][14:]
  92.             return (distname, version, id)
  93.         
  94.     
  95.     return (distname, version, id)
  96.  
  97. _release_filename = re.compile('(\\w+)[-_](release|version)')
  98. _release_version = re.compile('([\\d.]+)[^(]*(?:\\((.+)\\))?')
  99.  
  100. def dist(distname = '', version = '', id = '', supported_dists = ('SuSE', 'debian', 'fedora', 'redhat', 'mandrake')):
  101.     
  102.     try:
  103.         etc = os.listdir('/etc')
  104.     except os.error:
  105.         return (distname, version, id)
  106.  
  107.     for file in etc:
  108.         m = _release_filename.match(file)
  109.         if m:
  110.             (_distname, dummy) = m.groups()
  111.             if _distname in supported_dists:
  112.                 distname = _distname
  113.                 break
  114.             
  115.         _distname in supported_dists
  116.     else:
  117.         return _dist_try_harder(distname, version, id)
  118.     f = open('/etc/' + file, 'r')
  119.     firstline = f.readline()
  120.     f.close()
  121.     m = _release_version.search(firstline)
  122.     if m:
  123.         (_version, _id) = m.groups()
  124.         if _version:
  125.             version = _version
  126.         
  127.         if _id:
  128.             id = _id
  129.         
  130.     else:
  131.         l = string.split(string.strip(firstline))
  132.         if l:
  133.             version = l[0]
  134.             if len(l) > 1:
  135.                 id = l[1]
  136.             
  137.         
  138.     return (distname, version, id)
  139.  
  140.  
  141. class _popen:
  142.     tmpfile = ''
  143.     pipe = None
  144.     bufsize = None
  145.     mode = 'r'
  146.     
  147.     def __init__(self, cmd, mode = 'r', bufsize = None):
  148.         if mode != 'r':
  149.             raise ValueError, 'popen()-emulation only supports read mode'
  150.         
  151.         import tempfile as tempfile
  152.         self.tmpfile = tmpfile = tempfile.mktemp()
  153.         os.system(cmd + ' > %s' % tmpfile)
  154.         self.pipe = open(tmpfile, 'rb')
  155.         self.bufsize = bufsize
  156.         self.mode = mode
  157.  
  158.     
  159.     def read(self):
  160.         return self.pipe.read()
  161.  
  162.     
  163.     def readlines(self):
  164.         if self.bufsize is not None:
  165.             return self.pipe.readlines()
  166.         
  167.  
  168.     
  169.     def close(self, remove = os.unlink, error = os.error):
  170.         if self.pipe:
  171.             rc = self.pipe.close()
  172.         else:
  173.             rc = 255
  174.         if self.tmpfile:
  175.             
  176.             try:
  177.                 remove(self.tmpfile)
  178.             except error:
  179.                 pass
  180.             except:
  181.                 None<EXCEPTION MATCH>error
  182.             
  183.  
  184.         None<EXCEPTION MATCH>error
  185.         return rc
  186.  
  187.     __del__ = close
  188.  
  189.  
  190. def popen(cmd, mode = 'r', bufsize = None):
  191.     popen = None
  192.     if os.environ.get('OS', '') == 'Windows_NT':
  193.         
  194.         try:
  195.             import win32pipe as win32pipe
  196.         except ImportError:
  197.             pass
  198.  
  199.         popen = win32pipe.popen
  200.     
  201.     if popen is None:
  202.         if hasattr(os, 'popen'):
  203.             popen = os.popen
  204.             if sys.platform == 'win32':
  205.                 
  206.                 try:
  207.                     popen('')
  208.                 except os.error:
  209.                     popen = _popen
  210.                 except:
  211.                     None<EXCEPTION MATCH>os.error
  212.                 
  213.  
  214.             None<EXCEPTION MATCH>os.error
  215.         else:
  216.             popen = _popen
  217.     
  218.     if bufsize is None:
  219.         return popen(cmd, mode)
  220.     else:
  221.         return popen(cmd, mode, bufsize)
  222.  
  223.  
  224. def _norm_version(version, build = ''):
  225.     l = string.split(version, '.')
  226.     if build:
  227.         l.append(build)
  228.     
  229.     
  230.     try:
  231.         ints = map(int, l)
  232.     except ValueError:
  233.         strings = l
  234.  
  235.     strings = map(str, ints)
  236.     version = string.join(strings[:3], '.')
  237.     return version
  238.  
  239. _ver_output = re.compile('(?:([\\w ]+) ([\\w.]+) .*Version ([\\d.]+))')
  240.  
  241. def _syscmd_ver(system = '', release = '', version = '', supported_platforms = ('win32', 'win16', 'dos', 'os2')):
  242.     if sys.platform not in supported_platforms:
  243.         return (system, release, version)
  244.     
  245.     for cmd in ('ver', 'command /c ver', 'cmd /c ver'):
  246.         
  247.         try:
  248.             pipe = popen(cmd)
  249.             info = pipe.read()
  250.             if pipe.close():
  251.                 raise os.error, 'command failed'
  252.         except os.error:
  253.             why = None
  254.             continue
  255.             continue
  256.             except IOError:
  257.                 why = None
  258.                 continue
  259.                 continue
  260.             else:
  261.                 break
  262.         return (system, release, version)
  263.         info = string.strip(info)
  264.         m = _ver_output.match(info)
  265.         if m:
  266.             (system, release, version) = m.groups()
  267.             if release[-1] == '.':
  268.                 release = release[:-1]
  269.             
  270.             if version[-1] == '.':
  271.                 version = version[:-1]
  272.             
  273.             version = _norm_version(version)
  274.         
  275.  
  276.     return (system, release, version)
  277.  
  278.  
  279. def _win32_getvalue(key, name, default = ''):
  280.     RegQueryValueEx = RegQueryValueEx
  281.     import win32api
  282.     
  283.     try:
  284.         return RegQueryValueEx(key, name)
  285.     except:
  286.         return default
  287.  
  288.  
  289.  
  290. def win32_ver(release = '', version = '', csd = '', ptype = ''):
  291.     
  292.     try:
  293.         import win32api
  294.     except ImportError:
  295.         return (release, version, csd, ptype)
  296.  
  297.     RegQueryValueEx = RegQueryValueEx
  298.     RegOpenKeyEx = RegOpenKeyEx
  299.     RegCloseKey = RegCloseKey
  300.     GetVersionEx = GetVersionEx
  301.     import win32api
  302.     HKEY_LOCAL_MACHINE = HKEY_LOCAL_MACHINE
  303.     VER_PLATFORM_WIN32_NT = VER_PLATFORM_WIN32_NT
  304.     VER_PLATFORM_WIN32_WINDOWS = VER_PLATFORM_WIN32_WINDOWS
  305.     import win32con
  306.     (maj, min, buildno, plat, csd) = GetVersionEx()
  307.     version = '%i.%i.%i' % (maj, min, buildno & 65535)
  308.     if csd[:13] == 'Service Pack ':
  309.         csd = 'SP' + csd[13:]
  310.     
  311.     if plat == VER_PLATFORM_WIN32_WINDOWS:
  312.         regkey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
  313.         if maj == 4:
  314.             if min == 0:
  315.                 release = '95'
  316.             elif min == 10:
  317.                 release = '98'
  318.             elif min == 90:
  319.                 release = 'Me'
  320.             else:
  321.                 release = 'postMe'
  322.         elif maj == 5:
  323.             release = '2000'
  324.         
  325.     elif plat == VER_PLATFORM_WIN32_NT:
  326.         regkey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'
  327.         if maj <= 4:
  328.             release = 'NT'
  329.         elif maj == 5:
  330.             if min == 0:
  331.                 release = '2000'
  332.             elif min == 1:
  333.                 release = 'XP'
  334.             elif min == 2:
  335.                 release = '2003Server'
  336.             else:
  337.                 release = 'post2003'
  338.         
  339.     elif not release:
  340.         release = '%i.%i' % (maj, min)
  341.     
  342.     return (release, version, csd, ptype)
  343.     
  344.     try:
  345.         keyCurVer = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey)
  346.         RegQueryValueEx(keyCurVer, 'SystemRoot')
  347.     except:
  348.         return (release, version, csd, ptype)
  349.  
  350.     build = _win32_getvalue(keyCurVer, 'CurrentBuildNumber', ('', 1))[0]
  351.     ptype = _win32_getvalue(keyCurVer, 'CurrentType', (ptype, 1))[0]
  352.     version = _norm_version(version, build)
  353.     RegCloseKey(keyCurVer)
  354.     return (release, version, csd, ptype)
  355.  
  356.  
  357. def _mac_ver_lookup(selectors, default = None):
  358.     gestalt = gestalt
  359.     import gestalt
  360.     import MacOS as MacOS
  361.     l = []
  362.     append = l.append
  363.     for selector in selectors:
  364.         
  365.         try:
  366.             append(gestalt(selector))
  367.         continue
  368.         except (RuntimeError, MacOS.Error):
  369.             append(default)
  370.             continue
  371.         
  372.  
  373.     
  374.     return l
  375.  
  376.  
  377. def _bcd2str(bcd):
  378.     return hex(bcd)[2:]
  379.  
  380.  
  381. def mac_ver(release = '', versioninfo = ('', '', ''), machine = ''):
  382.     
  383.     try:
  384.         import gestalt
  385.         import MacOS
  386.     except ImportError:
  387.         return (release, versioninfo, machine)
  388.  
  389.     (sysv, sysu, sysa) = _mac_ver_lookup(('sysv', 'sysu', 'sysa'))
  390.     if sysv:
  391.         major = (sysv & 65280) >> 8
  392.         minor = (sysv & 240) >> 4
  393.         patch = sysv & 15
  394.         if (major, minor) >= (10, 4):
  395.             (major, minor, patch) = _mac_ver_lookup(('sys1', 'sys2', 'sys3'))
  396.             release = '%i.%i.%i' % (major, minor, patch)
  397.         else:
  398.             release = '%s.%i.%i' % (_bcd2str(major), minor, patch)
  399.     
  400.     if sysu:
  401.         major = int((sysu & 0xFF000000L) >> 24)
  402.         minor = (sysu & 15728640) >> 20
  403.         bugfix = (sysu & 983040) >> 16
  404.         stage = (sysu & 65280) >> 8
  405.         nonrel = sysu & 255
  406.         version = '%s.%i.%i' % (_bcd2str(major), minor, bugfix)
  407.         nonrel = _bcd2str(nonrel)
  408.         stage = {
  409.             32: 'development',
  410.             64: 'alpha',
  411.             96: 'beta',
  412.             128: 'final' }.get(stage, '')
  413.         versioninfo = (version, stage, nonrel)
  414.     
  415.     if sysa:
  416.         machine = {
  417.             1: '68k',
  418.             2: 'PowerPC',
  419.             10: 'i386' }.get(sysa, '')
  420.     
  421.     return (release, versioninfo, machine)
  422.  
  423.  
  424. def _java_getprop(name, default):
  425.     System = System
  426.     import java.lang
  427.     
  428.     try:
  429.         return System.getProperty(name)
  430.     except:
  431.         return default
  432.  
  433.  
  434.  
  435. def java_ver(release = '', vendor = '', vminfo = ('', '', ''), osinfo = ('', '', '')):
  436.     
  437.     try:
  438.         import java.lang as java
  439.     except ImportError:
  440.         return (release, vendor, vminfo, osinfo)
  441.  
  442.     vendor = _java_getprop('java.vendor', vendor)
  443.     release = _java_getprop('java.version', release)
  444.     (vm_name, vm_release, vm_vendor) = vminfo
  445.     vm_name = _java_getprop('java.vm.name', vm_name)
  446.     vm_vendor = _java_getprop('java.vm.vendor', vm_vendor)
  447.     vm_release = _java_getprop('java.vm.version', vm_release)
  448.     vminfo = (vm_name, vm_release, vm_vendor)
  449.     (os_name, os_version, os_arch) = osinfo
  450.     os_arch = _java_getprop('java.os.arch', os_arch)
  451.     os_name = _java_getprop('java.os.name', os_name)
  452.     os_version = _java_getprop('java.os.version', os_version)
  453.     osinfo = (os_name, os_version, os_arch)
  454.     return (release, vendor, vminfo, osinfo)
  455.  
  456.  
  457. def system_alias(system, release, version):
  458.     if system == 'Rhapsody':
  459.         return ('MacOS X Server', system + release, version)
  460.     elif system == 'SunOS':
  461.         if release < '5':
  462.             return (system, release, version)
  463.         
  464.         l = string.split(release, '.')
  465.         if l:
  466.             
  467.             try:
  468.                 major = int(l[0])
  469.             except ValueError:
  470.                 pass
  471.  
  472.             major = major - 3
  473.             l[0] = str(major)
  474.             release = string.join(l, '.')
  475.         
  476.         if release < '6':
  477.             system = 'Solaris'
  478.         else:
  479.             system = 'Solaris'
  480.     elif system == 'IRIX64':
  481.         system = 'IRIX'
  482.         if version:
  483.             version = version + ' (64bit)'
  484.         else:
  485.             version = '64bit'
  486.     elif system in ('win32', 'win16'):
  487.         system = 'Windows'
  488.     
  489.     return (system, release, version)
  490.  
  491.  
  492. def _platform(*args):
  493.     platform = string.join(map(string.strip, filter(len, args)), '-')
  494.     replace = string.replace
  495.     platform = replace(platform, ' ', '_')
  496.     platform = replace(platform, '/', '-')
  497.     platform = replace(platform, '\\', '-')
  498.     platform = replace(platform, ':', '-')
  499.     platform = replace(platform, ';', '-')
  500.     platform = replace(platform, '"', '-')
  501.     platform = replace(platform, '(', '-')
  502.     platform = replace(platform, ')', '-')
  503.     platform = replace(platform, 'unknown', '')
  504.     while None:
  505.         cleaned = replace(platform, '--', '-')
  506.         if cleaned == platform:
  507.             break
  508.         
  509.         platform = cleaned
  510.         continue
  511.         while platform[-1] == '-':
  512.             platform = platform[:-1]
  513.         return platform
  514.  
  515.  
  516. def _node(default = ''):
  517.     
  518.     try:
  519.         import socket as socket
  520.     except ImportError:
  521.         return default
  522.  
  523.     
  524.     try:
  525.         return socket.gethostname()
  526.     except socket.error:
  527.         return default
  528.  
  529.  
  530. if not hasattr(os.path, 'abspath'):
  531.     
  532.     def _abspath(path, isabs = os.path.isabs, join = os.path.join, getcwd = os.getcwd, normpath = os.path.normpath):
  533.         if not isabs(path):
  534.             path = join(getcwd(), path)
  535.         
  536.         return normpath(path)
  537.  
  538. else:
  539.     _abspath = os.path.abspath
  540.  
  541. def _follow_symlinks(filepath):
  542.     filepath = _abspath(filepath)
  543.     while os.path.islink(filepath):
  544.         filepath = os.path.normpath(os.path.join(os.path.dirname(filepath), os.readlink(filepath)))
  545.     return filepath
  546.  
  547.  
  548. def _syscmd_uname(option, default = ''):
  549.     if sys.platform in ('dos', 'win32', 'win16', 'os2'):
  550.         return default
  551.     
  552.     
  553.     try:
  554.         f = os.popen('uname %s 2> /dev/null' % option)
  555.     except (AttributeError, os.error):
  556.         return default
  557.  
  558.     output = string.strip(f.read())
  559.     rc = f.close()
  560.     if not output or rc:
  561.         return default
  562.     else:
  563.         return output
  564.  
  565.  
  566. def _syscmd_file(target, default = ''):
  567.     target = _follow_symlinks(target)
  568.     
  569.     try:
  570.         f = os.popen('file %s 2> /dev/null' % target)
  571.     except (AttributeError, os.error):
  572.         return default
  573.  
  574.     output = string.strip(f.read())
  575.     rc = f.close()
  576.     if not output or rc:
  577.         return default
  578.     else:
  579.         return output
  580.  
  581. _default_architecture = {
  582.     'win32': ('', 'WindowsPE'),
  583.     'win16': ('', 'Windows'),
  584.     'dos': ('', 'MSDOS') }
  585. _architecture_split = re.compile('[\\s,]').split
  586.  
  587. def architecture(executable = sys.executable, bits = '', linkage = ''):
  588.     if not bits:
  589.         import struct as struct
  590.         
  591.         try:
  592.             size = struct.calcsize('P')
  593.         except struct.error:
  594.             size = struct.calcsize('l')
  595.  
  596.         bits = str(size * 8) + 'bit'
  597.     
  598.     output = _syscmd_file(executable, '')
  599.     if not output and executable == sys.executable:
  600.         if _default_architecture.has_key(sys.platform):
  601.             (b, l) = _default_architecture[sys.platform]
  602.             if b:
  603.                 bits = b
  604.             
  605.             if l:
  606.                 linkage = l
  607.             
  608.         
  609.         return (bits, linkage)
  610.     
  611.     fileout = _architecture_split(output)[1:]
  612.     if 'executable' not in fileout:
  613.         return (bits, linkage)
  614.     
  615.     if '32-bit' in fileout:
  616.         bits = '32bit'
  617.     elif 'N32' in fileout:
  618.         bits = 'n32bit'
  619.     elif '64-bit' in fileout:
  620.         bits = '64bit'
  621.     
  622.     if 'ELF' in fileout:
  623.         linkage = 'ELF'
  624.     elif 'PE' in fileout:
  625.         if 'Windows' in fileout:
  626.             linkage = 'WindowsPE'
  627.         else:
  628.             linkage = 'PE'
  629.     elif 'COFF' in fileout:
  630.         linkage = 'COFF'
  631.     elif 'MS-DOS' in fileout:
  632.         linkage = 'MSDOS'
  633.     
  634.     return (bits, linkage)
  635.  
  636. _uname_cache = None
  637.  
  638. def uname():
  639.     global _uname_cache
  640.     if _uname_cache is not None:
  641.         return _uname_cache
  642.     
  643.     
  644.     try:
  645.         (system, node, release, version, machine) = os.uname()
  646.     except AttributeError:
  647.         system = sys.platform
  648.         release = ''
  649.         version = ''
  650.         node = _node()
  651.         machine = ''
  652.         processor = ''
  653.         use_syscmd_ver = 1
  654.         if system == 'win32':
  655.             (release, version, csd, ptype) = win32_ver()
  656.             if release and version:
  657.                 use_syscmd_ver = 0
  658.             
  659.         
  660.         if use_syscmd_ver:
  661.             (system, release, version) = _syscmd_ver(system)
  662.             if system == 'Microsoft Windows':
  663.                 system = 'Windows'
  664.             
  665.         
  666.         if system in ('win32', 'win16'):
  667.             if not version:
  668.                 if system == 'win32':
  669.                     version = '32bit'
  670.                 else:
  671.                     version = '16bit'
  672.             
  673.             system = 'Windows'
  674.         elif system[:4] == 'java':
  675.             (release, vendor, vminfo, osinfo) = java_ver()
  676.             system = 'Java'
  677.             version = string.join(vminfo, ', ')
  678.             if not version:
  679.                 version = vendor
  680.             
  681.         elif os.name == 'mac':
  682.             (version, stage, nonrel) = (release,)
  683.             machine = mac_ver()
  684.             system = 'MacOS'
  685.         
  686.     except:
  687.         system in ('win32', 'win16')
  688.  
  689.     if system == 'OpenVMS':
  690.         if not release or release == '0':
  691.             release = version
  692.             version = ''
  693.         
  694.         
  695.         try:
  696.             import vms_lib as vms_lib
  697.         except ImportError:
  698.             pass
  699.  
  700.         (csid, cpu_number) = vms_lib.getsyi('SYI$_CPU', 0)
  701.         if cpu_number >= 128:
  702.             processor = 'Alpha'
  703.         else:
  704.             processor = 'VAX'
  705.     else:
  706.         processor = _syscmd_uname('-p', '')
  707.     if system == 'unknown':
  708.         system = ''
  709.     
  710.     if node == 'unknown':
  711.         node = ''
  712.     
  713.     if release == 'unknown':
  714.         release = ''
  715.     
  716.     if version == 'unknown':
  717.         version = ''
  718.     
  719.     if machine == 'unknown':
  720.         machine = ''
  721.     
  722.     if processor == 'unknown':
  723.         processor = ''
  724.     
  725.     if system == 'Microsoft' and release == 'Windows':
  726.         system = 'Windows'
  727.         release = 'Vista'
  728.     
  729.     _uname_cache = (system, node, release, version, machine, processor)
  730.     return _uname_cache
  731.  
  732.  
  733. def system():
  734.     return uname()[0]
  735.  
  736.  
  737. def node():
  738.     return uname()[1]
  739.  
  740.  
  741. def release():
  742.     return uname()[2]
  743.  
  744.  
  745. def version():
  746.     return uname()[3]
  747.  
  748.  
  749. def machine():
  750.     return uname()[4]
  751.  
  752.  
  753. def processor():
  754.     return uname()[5]
  755.  
  756. _sys_version_parser = re.compile('([\\w.+]+)\\s*\\(#?([^,]+),\\s*([\\w ]+),\\s*([\\w :]+)\\)\\s*\\[([^\\]]+)\\]?')
  757. _sys_version_cache = None
  758.  
  759. def _sys_version():
  760.     global _sys_version_cache
  761.     if _sys_version_cache is not None:
  762.         return _sys_version_cache
  763.     
  764.     (version, buildno, builddate, buildtime, compiler) = _sys_version_parser.match(sys.version).groups()
  765.     builddate = builddate + ' ' + buildtime
  766.     l = string.split(version, '.')
  767.     if len(l) == 2:
  768.         l.append('0')
  769.         version = string.join(l, '.')
  770.     
  771.     _sys_version_cache = (version, buildno, builddate, compiler)
  772.     return _sys_version_cache
  773.  
  774.  
  775. def python_version():
  776.     return _sys_version()[0]
  777.  
  778.  
  779. def python_version_tuple():
  780.     return string.split(_sys_version()[0], '.')
  781.  
  782.  
  783. def python_build():
  784.     return _sys_version()[1:3]
  785.  
  786.  
  787. def python_compiler():
  788.     return _sys_version()[3]
  789.  
  790. _platform_cache = { }
  791.  
  792. def platform(aliased = 0, terse = 0):
  793.     result = _platform_cache.get((aliased, terse), None)
  794.     if result is not None:
  795.         return result
  796.     
  797.     (system, node, release, version, machine, processor) = uname()
  798.     if machine == processor:
  799.         processor = ''
  800.     
  801.     if aliased:
  802.         (system, release, version) = system_alias(system, release, version)
  803.     
  804.     if system == 'Windows':
  805.         (rel, vers, csd, ptype) = win32_ver(version)
  806.         if terse:
  807.             platform = _platform(system, release)
  808.         else:
  809.             platform = _platform(system, release, version, csd)
  810.     elif system in ('Linux',):
  811.         (distname, distversion, distid) = dist('')
  812.         if distname and not terse:
  813.             platform = _platform(system, release, machine, processor, 'with', distname, distversion, distid)
  814.         else:
  815.             (libcname, libcversion) = libc_ver(sys.executable)
  816.             platform = _platform(system, release, machine, processor, 'with', libcname + libcversion)
  817.     elif system == 'Java':
  818.         (os_name, os_version, os_arch) = (r, v, vminfo)
  819.         if terse:
  820.             platform = _platform(system, release, version)
  821.         else:
  822.             platform = _platform(system, release, version, 'on', os_name, os_version, os_arch)
  823.     elif system == 'MacOS':
  824.         if terse:
  825.             platform = _platform(system, release)
  826.         else:
  827.             platform = _platform(system, release, machine)
  828.     elif terse:
  829.         platform = _platform(system, release)
  830.     else:
  831.         (bits, linkage) = architecture(sys.executable)
  832.         platform = _platform(system, release, machine, processor, bits, linkage)
  833.     _platform_cache[(aliased, terse)] = platform
  834.     return platform
  835.  
  836. if __name__ == '__main__':
  837.     if not 'terse' in sys.argv:
  838.         pass
  839.     terse = '--terse' in sys.argv
  840.     if 'nonaliased' not in sys.argv:
  841.         pass
  842.     aliased = '--nonaliased' not in sys.argv
  843.     print platform(aliased, terse)
  844.     sys.exit(0)
  845.  
  846.